#此为添加的自定义认证类,使用的是Base

from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions

from api.models import Employee

"""
1,继承自BaseAuthentication
2,在里面要重写authenticate方法
3,自己定义规则
    没有认证信息返回None(游客)
    有认证不符合要求(非法用户)
    有认证信息符合要求,返回认证用户与信息(合法用户)
4,写完之后,需要配置认证器,全局和局部两种,一般在局部设置(因为每个部件要求不一样)
    
"""

class MyAuth(BaseAuthentication):
    """
    前段发送携带请求组认证的信息,必须按照写好的一定的格式进行发送
    默认使用Authorization携带认证信息
    认证信息都包含在request.META字段中
    """

    #重写authenticate方法
    def authenticate(self, request):
        #1,先获取认证信息
        auth=request.META.get('HTTP_AUTHORIZATION',None)

        if auth is None: #如果认证信息为空,则表示游客登录
            return None

        #2,设置认证信息的校验规则  " auth 认证信息 "
        auth_list=auth.split()

        # 校验规则：是否是合法用户  是不是两段式  如果第一个不是auth就错误
        if not (len(auth_list) == 2 and auth_list[0].lower() == "auth"):
            raise exceptions.AuthenticationFailed("认证信息有误，认证失败")

        # 如果认证成功 则解析用户  规定认证信息必须为abc.admin.123
        if auth_list[1] != "abc.marry.123":
            raise exceptions.AuthenticationFailed("用户信息校验失败")

        # 最后校验数据库是否存在此用户
        user = Employee.objects.filter(name="admin").first()

        if not user:
            raise exceptions.AuthenticationFailed("用户不存在")

        return (user, None)
